home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 September / PCWorld_2002-09_cd.bin / Software / Vyzkuste / httrack / httrack-3.20RC4.exe / {app} / src / htswizard.c < prev    next >
C/C++ Source or Header  |  2002-07-09  |  29KB  |  815 lines

  1. /* ------------------------------------------------------------ */
  2. /*
  3. HTTrack Website Copier, Offline Browser for Windows and Unix
  4. Copyright (C) Xavier Roche and other contributors
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20.  
  21. Important notes:
  22.  
  23. - We hereby ask people using this source NOT to use it in purpose of grabbing
  24. emails addresses, or collecting any other private information on persons.
  25. This would disgrace our work, and spoil the many hours we spent on it.
  26.  
  27.  
  28. Please visit our Website: http://www.httrack.com
  29. */
  30.  
  31.  
  32. /* ------------------------------------------------------------ */
  33. /* File: httrack.c subroutines:                                 */
  34. /*       wizard system (accept/refuse links)                    */
  35. /* Author: Xavier Roche                                         */
  36. /* ------------------------------------------------------------ */
  37.  
  38. #include "htswizard.h"
  39. #include "htsdefines.h"
  40.  
  41. /* specific definitions */
  42. #include "htsbase.h"
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <string.h>
  46. #include <ctype.h>
  47. /* END specific definitions */
  48.  
  49. // version 1 pour httpmirror
  50. // flusher si on doit lire peu α peu le fichier
  51. #define test_flush if (opt->flush) { fflush(opt->log); fflush(opt->errlog); }
  52.  
  53. // pour allΘger la syntaxe, des raccourcis sont crΘΘs
  54. #define urladr   (liens[ptr]->adr)
  55. #define urlfil   (liens[ptr]->fil)
  56.  
  57. // libΘrer filters[0] pour insΘrer un ΘlΘment dans filters[0]
  58. #define HT_INSERT_FILTERS0 {\
  59.   int i;\
  60.   if (*filptr > 0) {\
  61.     for(i = (*filptr)-1 ; i>=0 ; i--) {\
  62.       strcpy(filters[i+1],filters[i]);\
  63.     }\
  64.   }\
  65.   strcpy(filters[0],"");\
  66.   (*filptr)++;\
  67.   (*filptr)=minimum((*filptr),filter_max);\
  68. }
  69.  
  70.  
  71.  
  72. /*
  73. httrackp opt     bloc d'options
  74. int ptr,int lien_tot,lien_url** liens
  75.                              relatif aux liens
  76. char* adr,char* fil
  77.                              adresse/fichier α tester
  78. char** filters,int filptr,int filter_max
  79.                              relatif aux filtres
  80. robots_wizard* robots
  81.                              relatif aux robots
  82. int* set_prio_to
  83.                              callback obligatoire "capturer ce lien avec prio=N-1"
  84. int* just_test_it
  85.                              callback optionnel "ne faire que tester ce lien Θventuellement"
  86. retour:
  87.                0 acceptΘ
  88.                1 refusΘ
  89.                -1 pas d'avis
  90. */
  91. int hts_acceptlink(httrackp* opt,
  92.                    int ptr,int lien_tot,lien_url** liens,
  93.                    char* adr,char* fil,
  94.                    char** filters,int* filptr,int filter_max,
  95.                    robots_wizard* robots,
  96.                    int* set_prio_to,
  97.                    int* just_test_it) {
  98.   
  99.   int forbidden_url=-1;
  100.   int meme_adresse;
  101.  
  102.   // -------------------- PHASE 1 --------------------
  103.  
  104.   /* Infos */
  105.   if ((opt->debug>1) && (opt->log!=NULL)) {
  106.     fspc(opt->log,"debug"); fprintf(opt->log,"wizard test begins: %s%s"LF,adr,fil);
  107.     test_flush;
  108.   }
  109.  
  110.   /* Doit-on traiter les non html? */
  111.   if ((opt->getmode & 2)==0) {    // non on ne doit pas
  112.     if (!ishtml(fil)) {  // non il ne faut pas
  113.       //adr[0]='\0';    // ne pas traiter ce lien, pas traiter
  114.       forbidden_url=1;    // interdire rΘcupΘration du lien
  115.       if ((opt->debug>1) && (opt->log!=NULL)) {
  116.         fspc(opt->log,"debug"); fprintf(opt->log,"non-html file ignored at %s : %s"LF,adr,fil);
  117.         test_flush;
  118.       }
  119.       
  120.     }
  121.   }
  122.   
  123.   /* Niveau 1: ne pas parser suivant! */
  124.   if (ptr>0) {
  125.     if (liens[ptr]->depth <= 1) {
  126.       forbidden_url=1;    // interdire rΘcupΘration du lien
  127.       if ((opt->debug>1) && (opt->log!=NULL)) {
  128.         fspc(opt->log,"debug"); fprintf(opt->log,"file from too far level ignored at %s : %s"LF,adr,fil);
  129.         test_flush;
  130.       }
  131.     }
  132.   }
  133.  
  134.   /* en cas d'Θchec en phase 1, retour immΘdiat! */
  135.   if (forbidden_url==1) {
  136.     return forbidden_url;
  137.   }
  138.   
  139.   // -------------------- PHASE 2 --------------------
  140.  
  141.   // ------------------------------------------------------
  142.   // doit-on traiter ce lien?.. vΘrifier droits de dΘplacement
  143.   meme_adresse=strfield2(adr,urladr);
  144.   if ((opt->debug>1) && (opt->log!=NULL)) {
  145.     fspc(opt->log,"debug"); 
  146.     if (meme_adresse) 
  147.       fprintf(opt->log,"Compare addresses: %s=%s"LF,adr,urladr);
  148.     else
  149.       fprintf(opt->log,"Compare addresses: %s!=%s"LF,adr,urladr);
  150.     test_flush;
  151.   }
  152.   if (meme_adresse) {  // mΩme adresse 
  153.     {  // tester interdiction de descendre
  154.       // MODIFIE : en cas de remontΘe puis de redescente, il se pouvait qu'on ne puisse pas atteindre certains fichiers
  155.       // problΦme: si un fichier est virtuellement accessible via une page mais dont le lien est sur une autre *uniquement*..
  156.       char tempo[HTS_URLMAXSIZE*2];
  157.       char tempo2[HTS_URLMAXSIZE*2];
  158.       
  159.       // note (up/down): on calcule α partir du lien primaire, ET du lien prΘcΘdent.
  160.       // ex: si on descend 2 fois on peut remonter 1 fois
  161.       
  162.       if (lienrelatif(tempo,fil,liens[liens[ptr]->premier]->fil)==0) {
  163.         if (lienrelatif(tempo2,fil,liens[ptr]->fil)==0) {
  164.           if ((opt->debug>1) && (opt->log!=NULL)) {
  165.             fspc(opt->log,"debug"); fprintf(opt->log,"build relative links to test: %s %s (with %s and %s)"LF,tempo,tempo2,liens[liens[ptr]->premier]->fil,liens[ptr]->fil);
  166.             test_flush;
  167.           }
  168.           
  169.           // si vient de primary, ne pas tester lienrelatif avec (car host "diffΘrent")
  170.           /*if (liens[liens[ptr]->premier] == 0) {   // vient de primary
  171.           }
  172.           */
  173.           
  174.           // NEW: finalement OK, sauf pour les moved repΘrΘs par link_import
  175.           // PROBLEME : annulΘ a cause d'un lien Θventuel isolΘ acceptΘ..qui entrainerait un miroir
  176.           
  177.           // (test mΩme niveau (NOUVEAU α cause de certains problΦmes de filtres non intΘgrΘs))
  178.           // NEW
  179.           if ( (!strchr(tempo+1,'/')) || (!strchr(tempo2+1,'/')) ) {
  180.             if (!liens[ptr]->link_import) {   // ne rΘsulte pas d'un 'moved'
  181.               forbidden_url=0;
  182.               if ((opt->debug>1) && (opt->log!=NULL)) {
  183.                 fspc(opt->log,"debug"); fprintf(opt->log,"same level link authorized: %s%s"LF,adr,fil);
  184.                 test_flush;
  185.               }
  186.             }
  187.           }
  188.           
  189.           // down
  190.           if ( (strncmp(tempo,"../",3)) || (strncmp(tempo2,"../",3)))  {   // pas montΘe sinon ne nbous concerne pas
  191.             int test1,test2;
  192.             if (!strncmp(tempo,"../",3))
  193.               test1=0;
  194.             else
  195.               test1 = (strchr(tempo +((*tempo =='/')?1:0),'/')!=NULL);
  196.             if (!strncmp(tempo2,"../",3))
  197.               test2=0;
  198.             else
  199.               test2 = (strchr(tempo2+((*tempo2=='/')?1:0),'/')!=NULL);
  200.             if ( (test1) && (test2) ) {   // on ne peut que descendre
  201.               if ((opt->seeker & 1)==0) {  // interdiction de descendre
  202.                 forbidden_url=1;
  203.                 if ((opt->debug>1) && (opt->log!=NULL)) {
  204.                   fspc(opt->log,"debug"); fprintf(opt->log,"lower link canceled: %s%s"LF,adr,fil);
  205.                   test_flush;
  206.                 }
  207.               } else {    // autorisΘ α priori - NEW
  208.                 if (!liens[ptr]->link_import) {   // ne rΘsulte pas d'un 'moved'
  209.                   forbidden_url=0;
  210.                   if ((opt->debug>1) && (opt->log!=NULL)) {
  211.                     fspc(opt->log,"debug"); fprintf(opt->log,"lower link authorized: %s%s"LF,adr,fil);
  212.                     test_flush;
  213.                   }
  214.                 }
  215.               }
  216.             } else if ( (test1) || (test2) ) {   // on peut descendre pour accΘder au lien
  217.               if ((opt->seeker & 1)!=0) {  // on peut descendre - NEW
  218.                 if (!liens[ptr]->link_import) {   // ne rΘsulte pas d'un 'moved'
  219.                   forbidden_url=0;
  220.                   if ((opt->debug>1) && (opt->log!=NULL)) {
  221.                     fspc(opt->log,"debug"); fprintf(opt->log,"lower link authorized: %s%s"LF,adr,fil);
  222.                     test_flush;
  223.                   }
  224.                 }
  225.               }
  226.             }
  227.           }
  228.           
  229.           
  230.           // up
  231.           if ( (!strncmp(tempo,"../",3)) && (!strncmp(tempo2,"../",3)) ) {    // impossible sans monter
  232.             if ((opt->seeker & 2)==0) {  // interdiction de monter
  233.               forbidden_url=1;
  234.               if ((opt->debug>1) && (opt->log!=NULL)) {
  235.                 fspc(opt->log,"debug"); fprintf(opt->log,"upper link canceled: %s%s"LF,adr,fil);
  236.                 test_flush;
  237.               }
  238.             } else {       // autorisΘ α monter - NEW
  239.               if (!liens[ptr]->link_import) {   // ne rΘsulte pas d'un 'moved'
  240.                 forbidden_url=0;
  241.                 if ((opt->debug>1) && (opt->log!=NULL)) {
  242.                   fspc(opt->log,"debug"); fprintf(opt->log,"upper link authorized: %s%s"LF,adr,fil);
  243.                   test_flush;
  244.                 }
  245.               }
  246.             }
  247.           } else if ( (!strncmp(tempo,"../",3)) || (!strncmp(tempo2,"../",3)) ) {    // Possible en montant
  248.             if ((opt->seeker & 2)!=0) {  // autorisΘ α monter - NEW
  249.               if (!liens[ptr]->link_import) {   // ne rΘsulte pas d'un 'moved'
  250.                 forbidden_url=0;
  251.                 if ((opt->debug>1) && (opt->log!=NULL)) {
  252.                   fspc(opt->log,"debug"); fprintf(opt->log,"upper link authorized: %s%s"LF,adr,fil);
  253.                   test_flush;
  254.                 }
  255.               }
  256.             }  // sinon autorisΘ en descente
  257.           }
  258.           
  259.           
  260.         } else {
  261.           if (opt->errlog) {
  262.             fprintf(opt->errlog,"Error building relative link %s and %s"LF,fil,liens[ptr]->fil);
  263.             test_flush;
  264.           }
  265.         }
  266.       } else {
  267.         if (opt->errlog) {
  268.           fprintf(opt->errlog,"Error building relative link %s and %s"LF,fil,liens[liens[ptr]->premier]->fil);
  269.           test_flush;
  270.         }
  271.       }
  272.       
  273.     }  // tester interdiction de descendre?
  274.     
  275.     {  // tester interdiction de monter
  276.       char tempo[HTS_URLMAXSIZE*2];
  277.       char tempo2[HTS_URLMAXSIZE*2];
  278.       if (lienrelatif(tempo,fil,liens[liens[ptr]->premier]->fil)==0) {
  279.         if (lienrelatif(tempo2,fil,liens[ptr]->fil)==0) {
  280.         } else {
  281.           if (opt->errlog) { 
  282.             fprintf(opt->errlog,"Error building relative link %s and %s"LF,fil,liens[ptr]->fil);
  283.             test_flush;
  284.           }
  285.           
  286.         }
  287.       } else {
  288.         if (opt->errlog) { 
  289.           fprintf(opt->errlog,"Error building relative link %s and %s"LF,fil,liens[liens[ptr]->premier]->fil);
  290.           test_flush;
  291.         }
  292.         
  293.       }
  294.     }   // fin tester interdiction de monter
  295.     
  296.   } else {    // adresse diffΘrente, sortir?
  297.     
  298.     //if (!opt->wizard) {    // mode non wizard
  299.     // doit-on traiter ce lien?.. vΘrifier droits de sortie
  300.     switch((opt->travel & 255)) {
  301.     case 0: 
  302.       if (!opt->wizard)    // mode non wizard
  303.         forbidden_url=1; break;    // interdicton de sortir au dela de l'adresse
  304.     case 1: {              // sortie sur le mΩme dom.xxx
  305.       int i=strlen(adr)-1;
  306.       int j=strlen(urladr)-1;
  307.       while( (i>0) && (adr[i]!='.')) i--;
  308.       while( (j>0) && (urladr[j]!='.')) j--;
  309.       i--; j--;
  310.       while( (i>0) && (adr[i]!='.')) i--;
  311.       while( (j>0) && (urladr[j]!='.')) j--;
  312.       if ((i>0) && (j>0)) {
  313.         if (!strfield2(adr+i,urladr+j)) {   // !=
  314.           if (!opt->wizard) {   // mode non wizard
  315.             //printf("refused: %s\n",adr);
  316.             forbidden_url=1;  // pas mΩme domaine  
  317.             if ((opt->debug>1) && (opt->log!=NULL)) {
  318.               fspc(opt->log,"debug"); fprintf(opt->log,"foreign domain link canceled: %s%s"LF,adr,fil);
  319.               test_flush;
  320.             }
  321.           }
  322.           
  323.         } else {
  324.           if (opt->wizard) {   // mode wizard
  325.             forbidden_url=0;  // mΩme domaine  
  326.             if ((opt->debug>1) && (opt->log!=NULL)) {
  327.               fspc(opt->log,"debug"); fprintf(opt->log,"same domain link authorized: %s%s"LF,adr,fil);
  328.               test_flush;
  329.             }
  330.           }
  331.         }
  332.         
  333.       } else
  334.         forbidden_url=1;
  335.             } 
  336.       break;  
  337.     case 2: {                      // sortie sur le mΩme .xxx
  338.       int i=strlen(adr)-1;
  339.       int j=strlen(urladr)-1;
  340.       while( (i>0) && (adr[i]!='.')) i--;
  341.       while( (j>0) && (urladr[j]!='.')) j--;
  342.       if ((i>0) && (j>0)) {
  343.         if (!strfield2(adr+i,urladr+j)) {   // !-
  344.           if (!opt->wizard) {   // mode non wizard
  345.             //printf("refused: %s\n",adr);
  346.             forbidden_url=1;  // pas mΩme .xx  
  347.             if ((opt->debug>1) && (opt->log!=NULL)) {
  348.               fspc(opt->log,"debug"); fprintf(opt->log,"foreign location link canceled: %s%s"LF,adr,fil);
  349.               test_flush;
  350.             }
  351.           }
  352.         } else {
  353.           if (opt->wizard) {   // mode wizard
  354.             forbidden_url=0;  // mΩme domaine  
  355.             if ((opt->debug>1) && (opt->log!=NULL)) {
  356.               fspc(opt->log,"debug"); fprintf(opt->log,"same location link authorized: %s%s"LF,adr,fil);
  357.               test_flush;
  358.             }
  359.           }
  360.         }
  361.       } else forbidden_url=1;     
  362.             } 
  363.       break;
  364.     case 7:                 // everywhere!!
  365.       if (opt->wizard) {   // mode wizard
  366.         forbidden_url=0;
  367.         break;
  368.       }
  369.     }  // switch
  370.     
  371.     // ANCIENNE POS -- rΘcupΘrer les liens α c⌠tΘs d'un lien (nearlink)
  372.     
  373.   }  // fin test adresse identique/diffΘrente
  374.  
  375.   // -------------------- PHASE 3 --------------------
  376.  
  377.   // rΘcupΘrer les liens α c⌠tΘs d'un lien (nearlink) (nvelle pos)
  378.   if (opt->nearlink) {
  379.     if (!ishtml(fil)) {  // non html
  380.       //printf("ok %s%s\n",ad,fil);
  381.       forbidden_url=0;    // autoriser
  382.       if ((opt->debug>1) && (opt->log!=NULL)) {
  383.         fspc(opt->log,"debug"); fprintf(opt->log,"near link authorized: %s%s"LF,adr,fil);
  384.         test_flush;
  385.       }
  386.     }
  387.   }
  388.   
  389.   // -------------------- PHASE 4 --------------------
  390.   
  391.   // ------------------------------------------------------
  392.   // Si wizard, il se peut qu'on autorise ou qu'on interdise 
  393.   // un lien spΘcial avant mΩme de tester sa position, sa hiΘrarchie etc.
  394.   // peut court-circuiter le forbidden_url prΘcΘdent
  395.   if (opt->wizard) { // le wizard entre en action..
  396.     //
  397.     int jok;
  398.     int question=1;         // poser une question                            
  399.     int force_mirror=0;     // pour mirror links
  400.     int filters_answer=0;   // dΘcision prise par les filtres
  401.     char l[HTS_URLMAXSIZE*2];
  402.     
  403.     if (forbidden_url!=-1) question=0;  // pas de question, rΘsolu
  404.     
  405.     // former URL complΦte du lien actuel
  406.     strcpy(l,jump_identification(adr));
  407.     if (*fil!='/') strcat(l,"/");
  408.     strcat(l,fil);
  409.     
  410.     // tester filters (URLs autorisΘes ou interdites explicitement)
  411.     
  412.     // si lien primaire on saute le joker, on est pas lΘmur
  413.     if (ptr==0) {  // lien primaire, autoriser
  414.       question=1;    // la question sera rΘsolue automatiquement
  415.       forbidden_url=0;
  416.     } else {
  417.       // filters, 0=sait pas 1=ok -1=interdit
  418.       jok = fa_strjoker(filters,*filptr,l,NULL,NULL);
  419.       if (jok == 1) {   // autorisΘ
  420.         filters_answer=1;  // dΘcision prise par les filtres
  421.         question=0;    // ne pas poser de question, autorisΘ
  422.         forbidden_url=0;  // URL autorisΘe
  423.         if ((opt->debug>1) && (opt->log!=NULL)) {
  424.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) explicit authorized link: link %s at %s%s"LF,l,urladr,urlfil);
  425.           test_flush;
  426.         }
  427.       } else if (jok == -1) {
  428.         filters_answer=1;  // dΘcision prise par les filtres
  429.         question=0;    // ne pas poser de question:
  430.         forbidden_url=1;   // URL interdite
  431.         if ((opt->debug>1) && (opt->log!=NULL)) {
  432.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) explicit forbidden link: link %s at %s%s"LF,l,urladr,urlfil);
  433.           test_flush;
  434.         }
  435.       }  // sinon on touche α rien
  436.     }
  437.     
  438.     // vΘrifier mode mirror links
  439.     if (question) {
  440.       if (opt->mirror_first_page) {    // mode mirror links
  441.         if (liens[ptr]->precedent==0) {  // parent=primary!
  442.           forbidden_url=0;    // autorisΘ
  443.           question=1;         // rΘsolution auto
  444.           force_mirror=5;     // mirror (5)
  445.           if ((opt->debug>1) && (opt->log!=NULL)) {
  446.             fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) explicit mirror link: link %s at %s%s"LF,l,urladr,urlfil);
  447.             test_flush;
  448.           }
  449.         }
  450.       }
  451.     }
  452.  
  453.     // vΘrifier rΘcursivitΘ extΘrieure
  454.     if ((question) && (ptr>0) && (!force_mirror)) {
  455.       if (opt->extdepth>0) {
  456.         // *set_prio_to = opt->extdepth + 1;
  457.         *set_prio_to = opt->extdepth + 1;
  458.         forbidden_url=0;    // autorisΘ
  459.         question=0;         // rΘsolution auto
  460.         if ((opt->debug>1) && (opt->log!=NULL)) {
  461.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) ambiguous link accepted (external depth): link %s at %s%s"LF,l,urladr,urlfil);
  462.           test_flush;
  463.         }
  464.       }
  465.     }  
  466.     
  467.     // on doit poser la question.. peut on la poser?
  468.     // (oui je sais quel preuve de dΘlicatesse, merci merci)      
  469.     if ((question) && (ptr>0) && (!force_mirror)) {
  470.       if (opt->wizard==2) {    // Θliminer tous les liens non rΘpertoriΘs comme autorisΘs (ou inconnus)
  471.         question=0;
  472.         forbidden_url=1;
  473.         if ((opt->debug>1) && (opt->log!=NULL)) {
  474.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) ambiguous forbidden link: link %s at %s%s"LF,l,urladr,urlfil);
  475.           test_flush;
  476.         }
  477.       }
  478.     }
  479.     
  480.     // vΘrifier robots.txt
  481.     if (opt->robots) {
  482.       int r = checkrobots(robots,adr,fil);
  483.       if (r == -1) {    // interdiction
  484. #if DEBUG_ROBOTS
  485.         printf("robots.txt forbidden: %s%s\n",adr,fil);
  486. #endif
  487.         // question rΘsolue, par les filtres, et mode robot non strict
  488.         if ((!question) && (filters_answer) && (opt->robots == 1) && (forbidden_url!=1)) {
  489.           r=0;    // annuler interdiction des robots
  490.           if (!forbidden_url) {
  491.             if ((opt->debug>1) && (opt->log!=NULL)) {
  492.               fspc(opt->log,"debug"); fprintf(opt->log,"Warning link followed against robots.txt: link %s at %s%s"LF,l,adr,fil);
  493.               test_flush;
  494.             }
  495.           }
  496.         }
  497.         if (r == -1) {    // interdire
  498.           forbidden_url=1;
  499.           question=0;
  500.           if ((opt->debug>1) && (opt->log!=NULL)) {
  501.             fspc(opt->log,"debug"); fprintf(opt->log,"(robots.txt) forbidden link: link %s at %s%s"LF,l,adr,fil);
  502.             test_flush;
  503.           }
  504.         }
  505.       }
  506.     }
  507.     
  508.     if (!question) {
  509.       if ((opt->debug>1) && (opt->log!=NULL)) {
  510.         if (!forbidden_url) {
  511.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) shared foreign domain link: link %s at %s%s"LF,l,urladr,urlfil);
  512.         } else {
  513.           fspc(opt->log,"debug"); fprintf(opt->log,"(wizard) cancelled foreign domain link: link %s at %s%s"LF,l,urladr,urlfil);
  514.         }
  515.         test_flush;
  516.       }
  517. #if BDEBUG==3
  518.       printf("at %s in %s, wizard says: url %s ",urladr,urlfil,l);
  519.       if (forbidden_url) printf("cancelled"); else printf(">SHARED<");
  520.       printf("\n");
  521. #endif 
  522.     }
  523.  
  524.     /* en cas de question, ou lien primaire (enregistrer autorisations) */
  525.     if (question || (ptr==0)) {
  526. #if HTS_ANALYSTE
  527.       char* s;
  528. #else
  529.       char s[4];
  530. #endif
  531.       int n=0;
  532.       
  533.       // si primaire (plus bas) alors ...
  534.       if ((ptr!=0) && (force_mirror==0)) {
  535.         HTS_REQUEST_START;
  536.         HT_PRINT("\n");
  537.         HT_PRINT("At "); HT_PRINT(urladr); HT_PRINT(", there is a link ("); HT_PRINT(adr); HT_PRINT("/"); HT_PRINT(fil); HT_PRINT(") which goes outside the address."LF);
  538.         HT_PRINT("What should I do? (press a key + enter)"LF LF);
  539.         HT_PRINT("* Ignore all further links" LF);
  540.         HT_PRINT("0 Ignore this link (default if empty entry)"LF);
  541.         HT_PRINT("1 Ignore directory and lower structures"LF);
  542.         HT_PRINT("2 Ignore all domain"LF);
  543.         //HT_PRINT("3 (Ignore location, not implemented)\n");
  544.         HT_PRINT(LF);
  545.         HT_PRINT("4 Get only this page/link"LF);
  546.         HT_PRINT("5 Mirror this link (useful)"LF);
  547.         HT_PRINT("6 Mirror links located in the same domain"LF);
  548.         HT_PRINT(LF);
  549. //#if HTS_ANALYSTE!=2
  550. //HT_PRINT("! View extract of html code where the link is located"LF);
  551. //#endif
  552.         HTS_REQUEST_END;
  553. #if HTS_ANALYSTE
  554.           {
  555.             char tempo[HTS_URLMAXSIZE*2];
  556.             tempo[0]='\0';
  557.             strcat(tempo,adr);
  558.             strcat(tempo,"/");
  559.             strcat(tempo,fil);
  560.             s=hts_htmlcheck_query3(tempo);
  561.           }
  562. #else
  563.         do {
  564.           io_flush; linput(stdin,s,2);
  565. #endif
  566.           if (strnotempty(s)==0)  // entrΘe
  567.             n=0;
  568.           else if (isdigit((unsigned char)*s))
  569.             sscanf(s,"%d",&n);
  570.           else {
  571.             switch(*s) {
  572.             case '*': n=-1; break;
  573.             case '!': n=-999; {
  574.               /*char *a;
  575.               int i;                                    
  576.               a=copie_de_adr-128;
  577.               if (a<r.adr) a=r.adr;
  578.               for(i=0;i<256;i++) {
  579.                 if (a==copie_de_adr) printf("\nHERE:\n");
  580.                 printf("%c",*a++);
  581.               }
  582.               printf("\n\n");
  583.               */
  584.                       }
  585.               break;
  586.             default: n=-999; printf("What did you say?\n"); break;
  587.               
  588.             } 
  589.           }
  590. #if HTS_ANALYSTE
  591. #else
  592.         } while(n==-999);
  593. #endif
  594.         io_flush;
  595.       } else {   // lien primaire: autoriser rΘpertoire entier
  596.  
  597.         /* sanity check */
  598.         if ((*filptr) >= opt->maxfilter) {
  599.           printf("PANIC! : Too many filters : >%d [%d]\n", (*filptr),__LINE__);
  600.           fflush(stdout);
  601.           if (opt->errlog) {
  602.             fprintf(opt->errlog,LF"Too many filters, giving up..(>%d)"LF, (*filptr) );
  603.             fprintf(opt->errlog,"To avoid that: use #F option for more filters (example: -#F5000)"LF);
  604.             test_flush;
  605.           }
  606.           abort();         // wild..
  607.         }
  608.         
  609.         if (!force_mirror) {
  610.           if ((opt->seeker & 1)==0) {  // interdiction de descendre
  611.             n=7;
  612.           } else {
  613.             n=5;   // autoriser miroir rΘpertoires descendants (lien primaire)
  614.           }
  615.         } else   // forcer valeur (sub-wizard)
  616.           n=force_mirror;
  617.       }
  618.       
  619.       switch(n) {
  620.       case -1: // sauter tout le reste
  621.         forbidden_url=1;
  622.         opt->wizard=2;    // sauter tout le reste
  623.         break;
  624.       case 0:    // interdire les mΩmes liens: adr/fil
  625.         forbidden_url=1; 
  626.         HT_INSERT_FILTERS0;    // insΘrer en 0
  627.         strcpy(filters[0],"-");
  628.         strcat(filters[0],jump_identification(adr));
  629.         if (*fil!='/') strcat(filters[0],"/");
  630.         strcat(filters[0],fil);
  631.         break;
  632.         
  633.       case 1: // Θliminer rΘpertoire entier et sous rΘp: adr/path/ *
  634.         forbidden_url=1;
  635.         {
  636.           int i=strlen(fil)-1;
  637.           while((fil[i]!='/') && (i>0)) i--;
  638.           if (fil[i]=='/') {
  639.             HT_INSERT_FILTERS0;    // insΘrer en 0
  640.             strcpy(filters[0],"-");
  641.             strcat(filters[0],jump_identification(adr));
  642.             if (*fil!='/') strcat(filters[0],"/");
  643.             strncat(filters[0],fil,i);
  644.             if (filters[0][strlen(filters[0])-1]!='/') strcat(filters[0],"/");
  645.             strcat(filters[0],"*");
  646.           }
  647.         }            
  648.         
  649.         // ** ...
  650.         break;
  651.         
  652.       case 2:    // adresse adr*
  653.         forbidden_url=1;
  654.         HT_INSERT_FILTERS0;    // insΘrer en 0                                
  655.         strcpy(filters[0],"-");
  656.         strcat(filters[0],jump_identification(adr));
  657.         strcat(filters[0],"*");
  658.         break;
  659.         
  660.       case 3: // ** A FAIRE
  661.         forbidden_url=1;
  662.         /*
  663.         {
  664.         int i=strlen(adr)-1;
  665.         while((adr[i]!='/') && (i>0)) i--;
  666.         if (i>0) {
  667.         
  668.           }
  669.           
  670.       }*/
  671.         
  672.         break;
  673.         //
  674.       case 4:    // same link
  675.         // PAS BESOIN!!
  676.         /*HT_INSERT_FILTERS0;    // insΘrer en 0                                
  677.         strcpy(filters[0],"+");
  678.         strcat(filters[0],adr);
  679.         if (*fil!='/') strcat(filters[0],"/");
  680.         strcat(filters[0],fil);*/
  681.         
  682.         
  683.         // Θtant donnΘ le renversement wizard/primary filter (les primary autorisent up/down ET interdisent)
  684.         // il faut Θviter d'un lien isolΘ effectue un miroir total..
  685.         
  686.         *set_prio_to = 0+1;    // niveau de rΘcursion=0 (pas de miroir)
  687.         
  688.         break;
  689.         
  690.       case 5:    // autoriser rΘpertoire entier et fils
  691.         if ((opt->seeker & 2)==0) {  // interdiction de monter
  692.           int i=strlen(fil)-1;
  693.           while((fil[i]!='/') && (i>0)) i--;
  694.           if (fil[i]=='/') {
  695.             HT_INSERT_FILTERS0;    // insΘrer en 0                                
  696.             strcpy(filters[0],"+");
  697.             strcat(filters[0],jump_identification(adr));
  698.             if (*fil!='/') strcat(filters[0],"/");
  699.             strncat(filters[0],fil,i+1);
  700.             strcat(filters[0],"*");
  701.           }
  702.         } else {    // autoriser domaine alors!!
  703.           HT_INSERT_FILTERS0;    // insΘrer en 0                                strcpy(filters[filptr],"+");
  704.           strcpy(filters[0],"+");
  705.           strcat(filters[0],jump_identification(adr));
  706.           strcat(filters[0],"*");
  707.         }
  708.         break;
  709.         
  710.       case 6:    // same domain
  711.         HT_INSERT_FILTERS0;    // insΘrer en 0                                strcpy(filters[filptr],"+");
  712.         strcpy(filters[0],"+");
  713.         strcat(filters[0],jump_identification(adr));
  714.         strcat(filters[0],"*");
  715.         break;
  716.         //
  717.       case 7:    // autoriser ce rΘpertoire
  718.         {
  719.           int i=strlen(fil)-1;
  720.           while((fil[i]!='/') && (i>0)) i--;
  721.           if (fil[i]=='/') {
  722.             HT_INSERT_FILTERS0;    // insΘrer en 0                                
  723.             strcpy(filters[0],"+");
  724.             strcat(filters[0],jump_identification(adr));
  725.             if (*fil!='/') strcat(filters[0],"/");
  726.             strncat(filters[0],fil,i+1);
  727.             strcat(filters[0],"*[file]");
  728.           }
  729.         }
  730.         
  731.         break;
  732.         
  733.       case 50:    // on fait rien
  734.         break;
  735.       }  // switch 
  736.                               
  737.     }  // test du wizard sur l'url
  738.   }  // fin du test wizard..
  739.  
  740.   // -------------------- PHASE 5 --------------------
  741.  
  742.   // lien non autorisΘ, peut-on juste le tester?
  743.   if (just_test_it) {
  744.     if (forbidden_url==1) {
  745.       if (opt->travel&256) {    // tester tout de mΩme
  746.         if (strfield(adr,"ftp://")==0) {    // PAS ftp!
  747.           forbidden_url=1;    // oui oui toujours interdit (note: sert α rien car ==1 mais c pour comprendre)
  748.           *just_test_it=1;     // mais on teste
  749.           if ((opt->debug>1) && (opt->log!=NULL)) {
  750.             fspc(opt->log,"debug"); fprintf(opt->log,"Testing link %s%s"LF,adr,fil);
  751.           }
  752.         }
  753.       }
  754.     }
  755.     //adr[0]='\0';  // cancel
  756.   }
  757.  
  758.   // -------------------- PHASE 6 --------------------
  759. #if HTS_ANALYSTE
  760.   {
  761.     int test_url=hts_htmlcheck_check(adr,fil,forbidden_url);
  762.     if (test_url!=-1)
  763.       forbidden_url=test_url;
  764.   }
  765. #endif  
  766.   return forbidden_url;
  767. }
  768.  
  769. // tester taille
  770. int hts_testlinksize(httrackp* opt,
  771.                      char* adr,char* fil,
  772.                      LLint size) {
  773.   int jok=0;
  774.   if (size>=0) {
  775.     char l[HTS_URLMAXSIZE*2];
  776.     if (size>=0) {
  777.       LLint sz=size;
  778.       int size_flag=0;
  779.       
  780.       // former URL complΦte du lien actuel
  781.       strcpy(l,jump_identification(adr));
  782.       if (*fil!='/') strcat(l,"/");
  783.       strcat(l,fil);
  784.       
  785.       // tester filtres (taille)
  786.       jok = fa_strjoker(opt->filters.filters,*opt->filters.filptr,l,&sz,&size_flag);
  787.       
  788.       // log
  789.       if (jok==1) {
  790.         if ((opt->debug>1) && (opt->log!=NULL)) {
  791.           fspc(opt->log,"debug"); fprintf(opt->log,"File confirmed (size test): %s%s ("LLintP")"LF,adr,fil,(LLint)(size));
  792.         }
  793.       } else if (jok==-1) {
  794.         if (size_flag) {        /* interdit α cause de la taille */
  795.           if ((opt->debug>1) && (opt->log!=NULL)) {
  796.             fspc(opt->log,"debug"); fprintf(opt->log,"File cancelled due to its size: %s%s ("LLintP", limit: "LLintP")"LF,adr,fil,(LLint)(size),(LLint)(sz));
  797.           }
  798.         } else {
  799.           jok=1;
  800.         }
  801.       }
  802.     }
  803.   }
  804.   return jok;
  805. }
  806.  
  807.  
  808.  
  809. #undef test_flush
  810. #undef urladr
  811. #undef urlfil
  812.  
  813. #undef HT_INSERT_FILTERS0
  814.  
  815.